home *** CD-ROM | disk | FTP | other *** search
- //***************************************************************************************
- // AnimationHelper.cpp by Frank Luna (C) 2011 All Rights Reserved.
- //***************************************************************************************
-
- #include "AnimationHelper.h"
-
- using namespace DirectX;
-
- Keyframe::Keyframe()
- : TimePos(0.0f),
- Translation(0.0f, 0.0f, 0.0f),
- Scale(1.0f, 1.0f, 1.0f),
- RotationQuat(0.0f, 0.0f, 0.0f, 1.0f)
- {
- }
-
- Keyframe::~Keyframe()
- {
- }
-
- float BoneAnimation::GetStartTime()const
- {
- // Keyframes are sorted by time, so first keyframe gives start time.
- return Keyframes.front().TimePos;
- }
-
- float BoneAnimation::GetEndTime()const
- {
- // Keyframes are sorted by time, so last keyframe gives end time.
- float f = Keyframes.back().TimePos;
-
- return f;
- }
-
- void BoneAnimation::Interpolate(float t, XMFLOAT4X4& M)const
- {
- if( t <= Keyframes.front().TimePos )
- {
- XMVECTOR S = XMLoadFloat3(&Keyframes.front().Scale);
- XMVECTOR P = XMLoadFloat3(&Keyframes.front().Translation);
- XMVECTOR Q = XMLoadFloat4(&Keyframes.front().RotationQuat);
-
- XMVECTOR zero = XMVectorSet(0.0f, 0.0f, 0.0f, 1.0f);
- XMStoreFloat4x4(&M, XMMatrixAffineTransformation(S, zero, Q, P));
- }
- else if( t >= Keyframes.back().TimePos )
- {
- XMVECTOR S = XMLoadFloat3(&Keyframes.back().Scale);
- XMVECTOR P = XMLoadFloat3(&Keyframes.back().Translation);
- XMVECTOR Q = XMLoadFloat4(&Keyframes.back().RotationQuat);
-
- XMVECTOR zero = XMVectorSet(0.0f, 0.0f, 0.0f, 1.0f);
- XMStoreFloat4x4(&M, XMMatrixAffineTransformation(S, zero, Q, P));
- }
- else
- {
- for(UINT i = 0; i < Keyframes.size()-1; ++i)
- {
- if( t >= Keyframes[i].TimePos && t <= Keyframes[i+1].TimePos )
- {
- float lerpPercent = (t - Keyframes[i].TimePos) / (Keyframes[i+1].TimePos - Keyframes[i].TimePos);
-
- XMVECTOR s0 = XMLoadFloat3(&Keyframes[i].Scale);
- XMVECTOR s1 = XMLoadFloat3(&Keyframes[i+1].Scale);
-
- XMVECTOR p0 = XMLoadFloat3(&Keyframes[i].Translation);
- XMVECTOR p1 = XMLoadFloat3(&Keyframes[i+1].Translation);
-
- XMVECTOR q0 = XMLoadFloat4(&Keyframes[i].RotationQuat);
- XMVECTOR q1 = XMLoadFloat4(&Keyframes[i+1].RotationQuat);
-
- XMVECTOR S = XMVectorLerp(s0, s1, lerpPercent);
- XMVECTOR P = XMVectorLerp(p0, p1, lerpPercent);
- XMVECTOR Q = XMQuaternionSlerp(q0, q1, lerpPercent);
-
- XMVECTOR zero = XMVectorSet(0.0f, 0.0f, 0.0f, 1.0f);
- XMStoreFloat4x4(&M, XMMatrixAffineTransformation(S, zero, Q, P));
-
- break;
- }
- }
- }
- }